flowchart TD
    A[开始] --> B[接收POST请求]
    B --> C[获取请求参数]
    C --> D[记录日志:前端传递参数信息]
    D --> E{"courseList是否为空?"}
    E -->|是| F[记录错误日志:课程列表不能为空]
    F --> G[返回响应:课程列表不能为空]
    E -->|否| H[获取用户ID]
    H --> I[提取课程ID列表]
    I --> J[记录日志:用户购物车课程列表id]
    J --> K[获取Redis连接]
    K --> L[构造购物车键名]
    
    L --> M[遍历课程ID列表]
    M --> N[构造课程键名]
    N --> O[从Redis获取购物车项]
    O --> P{"购物车项是否存在?"}
    P -->|否| Q[记录错误日志:用户购物车中不存在课程]
    Q --> R[返回响应:课程不存在]
    P -->|是| S[解码并解析购物车项]
    S --> T[记录日志:用户购物车中课程信息]
    T --> U{"课程是否未选中?"}
    U -->|是| V[记录错误日志:课程未选中]
    V --> W[返回响应:课程未选中]
    U -->|否| X[继续处理下一个课程]
    
    M --> Y{"是否遍历完所有课程ID?"}
    Y -->|否| N
    Y -->|是| Z[查询数据库课程状态]
    Z --> AA[记录日志:数据库课程信息]
    AA --> AB{"数据库课程数量是否匹配?"}
    AB -->|否| AC[记录错误日志:存在未上架课程]
    AC --> AD[返回响应:存在未上架的课程]
    AB -->|是| AE[初始化计算总价为0]
    
    AE --> AF[遍历课程列表]
    AF --> AG[提取课程参数]
    AG --> AH{"是否为永久有效课程?"}
    AH -->|是| AI[查询永久课程价格]
    AH -->|否| AJ[查询有效期课程价格]
    AI --> AK[记录日志:课程永久有效价格]
    AJ --> AK
    AK --> AL[累加到计算总价]
    AL --> AM{"前端价格是否正确?"}
    AM -->|否| AN[记录错误日志:课程价格有误]
    AN --> AO[记录错误日志:价格对比详情]
    AO --> AP[返回响应:价格有误]
    AM -->|是| AQ
    
    AF --> AQ{"是否遍历完所有课程?"}
    AQ -->|否| AF
    AQ -->|是| AR{"总价是否一致?"}
    AR -->|否| AS[记录错误日志:总价格不一致]
    AS --> AT[返回响应:订单总价格有误]
    AR -->|是| AU[获取雪花算法实例]
    AU --> AV[生成订单编号]
    AV --> AW[记录日志:生成订单编号]
    AW --> AX[开启数据库事务]
    AX --> AY[创建订单主表记录]
    AY --> AZ[记录日志:创建订单表成功]
    
    AZ --> BA[遍历课程列表创建详情]
    BA --> BB[提取详情参数]
    BB --> BC[记录日志:正在创建订单详情表]
    BC --> BD{"是否为有限期课程?"}
    BD -->|是| BE[计算过期时间]
    BD -->|否| BF[过期时间为空]
    BE --> BG
    BF --> BG
    BG --> BH[创建订单详情记录]
    BH --> BI[记录日志:正在创建的订单详情]
    BA --> BJ{"是否创建完所有详情?"}
    BJ -->|否| BA
    BJ -->|是| BK[提交事务]
    
    BK --> BL[遍历课程ID列表]
    BL --> BM[构造课程键名]
    BM --> BN[从购物车删除已购课程]
    BL --> BO{"是否删除完所有课程?"}
    BO -->|否| BL
    BO -->|是| BP[返回成功响应]
    
    BP --> BQ[结束]
    G --> BQ
    R --> BQ
    W --> BQ
    AD --> BQ
    AP --> BQ
    AT --> BQ
    
    BR[捕获异常Exception]
    BR --> BS[记录错误日志:订单创建失败]
    BS --> BT[返回响应:订单创建失败]
    BT --> BQ
    
    AX --> BR
